import Vue from "vue";
import { reqCategory1List, reqCategory2List, reqCategory3List } from "@/api";
// import store from "..";


const state = {
    // 一级分类列表
    category1List: [],
};
const mutations = {
    // 给一级分类列表category1List设置新值
    set_category1List(state, payload) {
        state.category1List = payload.category1List;
        // 顺便给category1List中的每一个对象都添加一个children属性
        state.category1List.forEach((item) => {
            Vue.set(item, 'children', [])
        })
    },

    // 给一级分类对应id的对象，添加二级分类
    set_category2List(state, payload) {
        state.category1List[payload.nowCategoryIndex].children = payload.result
    }

};
const actions = {
    // 获取一级分类列表的数据
    async getCategory1List({ commit }) {
        const result = await reqCategory1List();
        // console.log(result, 'result');
        commit('set_category1List', { category1List: result })
    },

    // 获取二级分类列表的数据
    async getCategory2List(store, category1Id) {
        // 如果想要在actions函数中拿到当前的模块的state数据有两种方式 1.this：指的是完成的store  2.参数store：指的是当前的state
        // 先判断当前的category1Id对应的一级分类属性上children属性有没有值，如果有则说明已经获取过了，则不再发送请求，如果有则不再发送请求
        const nowCategory = store.state.category1List.find(
            (item) => item.id === category1Id
        )

        // 获取当前的category1Id所在的对象在category1List中的下标
        const nowCategoryIndex = store.state.category1List.findIndex(
            (item) => item.id === category1Id
        )

        console.log(nowCategory);

        if (nowCategory.children.length !== 0) return

        // 如果当前所在的一级分类列表没有children属性，则说明没有发送过请求，需要重新发送期请求
        const result = await reqCategory2List(category1Id);


        // 我们声明一个数组，专门保存所有三级期望求的promise，方便未来并发控制
        const reqArr = [];

        // 遍历所有的二级列表，根据二级列表id发送三级请求，我们把发送请求得到的promise使用数组收集起来
        result.forEach((item) => {
            const category3Promise = reqCategory3List(item.id)
            reqArr.push(category3Promise)
        });


        // 把收集的所有二级中的三级列表的请求所在的素组，使用promise.all进行并发处理
        // Promise.all返回promise实例，如果接收的参数中有的promise都成功，则all方法返回的promise就成功，值为所有结果值组成的数组
        const category3Result = await Promise.all(reqArr);

        console.log(category3Result);


        // 遍历请求的结果，把每一个值都插入到对应的二级列表中
        category3Result.forEach((item, index) => {
            result[index].children = item
        })

        // 提交mutation进行数据修改
        store.commit('set_category2List', { nowCategoryIndex, result })
    }

};
const getters = {};


export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters
}